home *** CD-ROM | disk | FTP | other *** search
/ Java Programmer's Toolkit / Java Programmer's Toolkit.iso / applets / commissi / optionap.jav < prev   
Text File  |  1995-12-19  |  10KB  |  290 lines

  1. import java.applet.*;
  2. import java.awt.*;
  3.  
  4. class OptionBeta {
  5.     double _value, _theta, _delta_S, _delta_X, _gamma_S, _gamma_X;
  6.     public OptionBeta() {
  7.     }
  8.     double value() {
  9.                 return _value;
  10.         }
  11.         public double theta() {
  12.                 return _theta;
  13.         }
  14.         public double delta_S() {
  15.                 return _delta_S;
  16.         }
  17.         public double delta_X() {
  18.                 return _delta_X;
  19.         }
  20.         public double gamma_S() {
  21.                 return _gamma_S;
  22.         }
  23.         public double gamma_X() {
  24.                 return _gamma_X;
  25.         }
  26. }
  27.  
  28. class OptionAmerBeta extends OptionBeta {
  29.     final int ITERATES = 30;
  30.     public OptionAmerBeta(double S, double X, double r_f, double r_d, double sigma, double T) {
  31.         int i,j;
  32.         double X1,S1,S2,c,e;
  33.         double u,d,p,q,t,p1,q1;
  34.         double s[] = new double[ITERATES + 3];
  35.         double d2,u2;
  36.     
  37.         c=T/ITERATES;
  38.         e=Math.exp(r_d*c);
  39.         u=Math.exp(sigma*Math.sqrt(c));
  40.         d=1/u;
  41.         p1=(Math.exp((r_d-r_f)*c)-d)/(u-d);
  42.         q1=(u-Math.exp((r_d-r_f)*c))/(u-d);
  43.         p=p1/e;
  44.         q=q1/e;
  45.         d2=d*d;
  46.         u2=u*u;
  47.         t=0.0f;
  48.     
  49.         X1=S/X;
  50.         S1=X1*Math.pow(u,(double)(ITERATES+2));
  51.         S2=S1;
  52.         for(j=0;j<=ITERATES+2;j++) {
  53.             s[j]=S2-1.0f;
  54.             if(s[j]<0.0f)
  55.                 s[j]=0.0f;
  56.             S2=S2*d2;
  57.         };
  58.         S1=S1*d;
  59.         for(i=ITERATES+1;2<=i;i--) {
  60.             S2=S1;
  61.             for(j=0;j<=i;j++) {
  62.                 s[j]=p*s[j]+q*s[j+1];
  63.                 if(s[j]<S2-1.0f)
  64.                     s[j]=S2-1.0f;
  65.                 S2=S2*d2;
  66.             };
  67.             if(i==4)
  68.                 t=s[2];
  69.             S1=S1*d;
  70.         };
  71.         _value=s[1]*X;
  72.         _delta_S=(s[0]-s[2])/(X1*(u2-d2));
  73.         _gamma_S=((s[0]-s[1])/(X1*(u2-1))-(s[1]-s[2])/(X1*(1-d2)))/
  74.             (X1*(u2-d2)/2)/X;
  75.         _delta_X=-(s[0]-s[2])/(X1*(u2-d2))*S/X+s[1];
  76.         _gamma_X=((s[0]-s[1])/(X1*(u2-1))-(s[1]-s[2])/(X1*(1-d2)))/
  77.             (X1*(u2-d2)/2)*S/X*S/(X*X);
  78.         for(i=1;0<=i;i--) {
  79.             S2=S1;
  80.             for(j=0;j<=i;j++) {
  81.                 s[j]=p*s[j]+q*s[j+1];
  82.                 if(s[j]<S2-1.0f)
  83.                     s[j]=S2-1.0f;
  84.                 if(s[j]==0.0f)
  85.                     break;
  86.                 S2=S2*d2;
  87.             };
  88.             S1=S1*d;
  89.         };
  90.         _theta=-(s[0]-t)*X/(c*4.0f)/365.0f;
  91.     }
  92. }
  93.  
  94. class OptionEuroBeta extends OptionBeta {
  95.     double normal(double x) {
  96.         double y;
  97.         double k;
  98.  
  99.         if(x<0)
  100.             return 1-normal(-x);
  101.         if(x==0)
  102.             return 0.5f;
  103.         k=1.0f/(1.0f+0.2316419f*x);
  104.         y=1-Math.exp(-x*x/2)*k*(0.31938153f+
  105.             k*(-0.356563782f+
  106.                 k*(1.781477937f+
  107.                     k*(-1.821255978f+
  108.                         k*1.330274429f))))/Math.sqrt(6.28318530717958646f);
  109.         return y;
  110.     }
  111.     public OptionEuroBeta(double S, double X, double r_f, double r_d, double sigma, double T) {
  112.         double x1, p1, q1, p2, q2, p3;
  113.  
  114.         x1=(Math.log(S/X)+(r_d-r_f+sigma*sigma/2)*T)/(sigma*Math.sqrt(T));
  115.         p1=normal(x1);
  116.         q1=normal(x1-sigma*Math.sqrt(T));
  117.         p2=Math.exp(-r_f*T);
  118.         q2=Math.exp(-r_d*T);
  119.         p3=Math.exp(-x1*x1/2)/Math.sqrt(6.28318530717958646f);
  120.     
  121.         _value=S*p2*p1-X*q2*q1;
  122.         _theta=-r_f*S*p2*p1+S*p2*p3*sigma/2/Math.sqrt(T)+r_d*X*q2*q1;
  123.         _theta=-_theta/365.0f;
  124.     
  125.         _delta_S=p2*p1;
  126.         _gamma_S=p2*p3/(S*sigma*Math.sqrt(T));
  127.         _delta_X=-q2*q1;
  128.         _gamma_X=q2*Math.exp(-(x1-sigma*Math.sqrt(T))*(x1-sigma*Math.sqrt(T))/2)/
  129.             Math.sqrt(6.28318530717958646f)/(X*sigma*Math.sqrt(T));
  130.     }
  131. }
  132.  
  133. public class OptionAppBeta extends Applet {
  134.     TextField value;
  135.     TextField delta;
  136.     TextField gamma;
  137.     TextField theta;
  138.     TextField price;
  139.     TextField strike;
  140.     TextField dividend;
  141.     TextField interest;
  142.     TextField volatility;
  143.     TextField time_left;
  144.     Checkbox is_call;
  145.     Checkbox is_put;
  146.     Checkbox is_american;
  147.     Checkbox is_european;
  148.     Checkbox is_daily;
  149.     Checkbox is_monthly;
  150.     Checkbox is_yearly;
  151.     CheckboxGroup call_put;
  152.     CheckboxGroup amer_euro;
  153.     CheckboxGroup dmy;
  154.     OptionEuroBeta optioneuro;
  155.     OptionAmerBeta optionamer;
  156.     public void init() {
  157.         add("ValueLabel", new Label("Value:", Label.RIGHT));
  158.         add("Value", value = new TextField("", 10));
  159.         add("DeltaLabel", new Label("Delta:", Label.RIGHT));
  160.         add("Delta", delta = new TextField("", 10));
  161.         add("GammaLabel", new Label("Gamma:", Label.RIGHT));
  162.         add("Gamma", gamma = new TextField("", 10));
  163.         add("ThetaLabel", new Label("Theta:", Label.RIGHT));
  164.         add("Theta", theta = new TextField("", 10));
  165.         add("PriceLabel", new Label("How much is the stock price? (in $.c)"));
  166.         add("Price", price = new TextField("", 10));
  167.         add("StrikeLabel", new Label("What is the strike price? (in $.c)"));
  168.         add("Strike", strike = new TextField("", 10));
  169.         add("DividendLabel", new Label("What is the dividend yield? (in % per annum)"));
  170.         add("Dividend", dividend = new TextField("", 10));
  171.         add("InterestLabel", new Label("What is the interest rate? (in % per annum)"));
  172.         add("Interest", interest = new TextField("", 10));
  173.         add("VolatilityLabel", new Label("What is the volatility? (in % per annum)"));
  174.         add("Volatility", volatility = new TextField("", 10));
  175.         add("Time_leftLabel", new Label("How long left to expiration?"));
  176.         add("Time_left", time_left = new TextField("", 10));
  177.         dmy = new CheckboxGroup();
  178.         amer_euro = new CheckboxGroup();
  179.         call_put = new CheckboxGroup();
  180.         add("Daily", is_daily = new Checkbox("Expiration in Days or...", dmy, true));
  181.         add("Monthly", is_monthly = new Checkbox("Months or...", dmy, false)); 
  182.         add("Yearly", is_yearly = new Checkbox("Years?", dmy, false));
  183.         dmy.setCurrent(is_daily);
  184.         add("Call", is_call = new Checkbox("Call option or...", call_put, true));
  185.         add("Put", is_put = new Checkbox("Put option?", call_put, false));
  186.         call_put.setCurrent(is_call);
  187.         add("American", is_american = new Checkbox("American option or...", amer_euro, true));
  188.         add("European", is_european = new Checkbox("European option?", amer_euro, false));
  189.         amer_euro.setCurrent(is_american);
  190.     }
  191.     public synchronized void layout() {
  192.         resize(500, 400);
  193.         if(0 < countComponents()) { 
  194.             getComponent(0).reshape(20, 10, 40, 30);
  195.             getComponent(1).reshape(60, 10, 70, 30);
  196.             getComponent(2).reshape(130, 10, 40, 30);
  197.             getComponent(3).reshape(170, 10, 70, 30);
  198.             getComponent(4).reshape(240, 10, 55, 30);
  199.             getComponent(5).reshape(295, 10, 70, 30);
  200.             getComponent(6).reshape(365, 10, 40, 30);
  201.             getComponent(7).reshape(405, 10, 70, 30);
  202.             getComponent(8).reshape(60, 70, 300, 30);
  203.             getComponent(9).reshape(360, 70, 80, 30);
  204.             getComponent(10).reshape(60, 100, 300, 30); 
  205.             getComponent(11).reshape(360, 100, 80, 30);
  206.             getComponent(12).reshape(60, 130, 300, 30);
  207.             getComponent(13).reshape(360, 130, 80, 30);
  208.             getComponent(14).reshape(60, 160, 300, 30);
  209.             getComponent(15).reshape(360, 160, 80, 30);
  210.             getComponent(16).reshape(60, 190, 300, 30);
  211.             getComponent(17).reshape(360, 190, 80, 30);
  212.             getComponent(18).reshape(60, 220, 300, 30);
  213.             getComponent(19).reshape(360, 220, 80, 30);
  214.             getComponent(20).reshape(60, 260, 160, 30);
  215.             getComponent(21).reshape(230, 260, 120, 30);
  216.             getComponent(22).reshape(350, 260, 120, 30);
  217.             getComponent(23).reshape(0, 290, 110, 30);
  218.             getComponent(24).reshape(110, 290, 100, 30);
  219.             getComponent(25).reshape(210, 290, 145, 30);
  220.             getComponent(26).reshape(355, 290, 140, 30);
  221.         }    
  222.     }
  223.     public void compute() {
  224.             double S, X, rf, rd, s, t;
  225.         try {
  226.             price.setText(price.getText().replace(',', '.'));
  227.             strike.setText(strike.getText().replace(',', '.'));
  228.             dividend.setText(dividend.getText().replace(',', '.'));
  229.             interest.setText(interest.getText().replace(',', '.'));
  230.             volatility.setText(volatility.getText().replace(',', '.'));
  231.             time_left.setText(time_left.getText().replace(',', '.'));
  232.             S = Double.valueOf(price.getText()).doubleValue();
  233.             X = Double.valueOf(strike.getText()).doubleValue();
  234.             rf = Double.valueOf(dividend.getText()).doubleValue() / 100.0f;
  235.             rd = Double.valueOf(interest.getText()).doubleValue() / 100.0f;
  236.             s = Double.valueOf(volatility.getText()).doubleValue() / 100.0f;
  237.             t = Double.valueOf(time_left.getText()).doubleValue();
  238.             if(dmy.getCurrent() == is_daily)
  239.                 t = t / 365.0;
  240.             if(dmy.getCurrent() == is_monthly)
  241.                 t = t / 12.0;
  242.             if(amer_euro.getCurrent() == is_european) {
  243.                 if(call_put.getCurrent() == is_call) {
  244.                     optioneuro = new OptionEuroBeta(S, X, rf, rd, s, t);
  245.                     value.setText(new Double(optioneuro.value()).toString());
  246.                     delta.setText(new Double(optioneuro.delta_S()).toString());
  247.                     gamma.setText(new Double(optioneuro.gamma_S()).toString());
  248.                     theta.setText(new Double(optioneuro.theta()).toString());
  249.                 };
  250.                 if(call_put.getCurrent() == is_put) {
  251.                     optioneuro = new OptionEuroBeta(X, S, rd, rf, s, t);
  252.                     value.setText(new Double(optioneuro.value()).toString());
  253.                     delta.setText(new Double(optioneuro.delta_X()).toString());
  254.                     gamma.setText(new Double(optioneuro.gamma_X()).toString());
  255.                     theta.setText(new Double(optioneuro.theta()).toString());
  256.                 };
  257.             };
  258.             if(amer_euro.getCurrent() == is_american) {
  259.                 if(call_put.getCurrent() == is_call) {
  260.                     optionamer = new OptionAmerBeta(S, X, rf, rd, s, t);
  261.                     value.setText(new Double(optionamer.value()).toString());
  262.                     delta.setText(new Double(optionamer.delta_S()).toString());
  263.                     gamma.setText(new Double(optionamer.gamma_S()).toString());
  264.                     theta.setText(new Double(optionamer.theta()).toString());
  265.                 };
  266.                 if(call_put.getCurrent() == is_put) {
  267.                     optionamer = new OptionAmerBeta(X, S, rd, rf, s, t);
  268.                     value.setText(new Double(optionamer.value()).toString());
  269.                     delta.setText(new Double(optionamer.delta_X()).toString());
  270.                     gamma.setText(new Double(optionamer.gamma_X()).toString());
  271.                     theta.setText(new Double(optionamer.theta()).toString());
  272.                 };
  273.             };
  274.         } catch(NumberFormatException e) {
  275.             value.setText("");
  276.             delta.setText("");
  277.             gamma.setText("");
  278.             theta.setText("");
  279.         }
  280.         repaint();
  281.     }
  282.         public boolean action(Event e, Object dummy) {
  283.          compute();
  284.         return(true);
  285.     }
  286.     public String getAppletInfo() {
  287.         return("Robert's Online Option Pricer! by Dr. Robert Lum");
  288.     }
  289. }
  290.